package repository

import (
	"context"
	"docker-api/internal/model"
	"docker-api/pkg/cmd"
	"docker-api/pkg/util"
	"fmt"
	"gorm.io/gorm"
)

type DockerVersionRepository interface {
	// 版本信息管理
	GetDockerVersion(ctx context.Context) (*model.DockerVersion, error)
	UpdateDockerVersion(ctx context.Context, version *model.DockerVersion) error
	CreateDockerVersion(ctx context.Context, version *model.DockerVersion) error
}

func NewDockerVersionRepository(
	r *Repository,
) DockerVersionRepository {
	return &dockerVersionRepository{
		Repository: r,
	}
}

type dockerVersionRepository struct {
	*Repository
}

// GetDockerVersion 获取 Docker 版本信息
func (r *dockerVersionRepository) GetDockerVersion(ctx context.Context) (*model.DockerVersion, error) {
	// 获取当前系统版本信息
	currentVersion, err := cmd.FetchCurrentVersionInfo()
	if err != nil {
		return nil, err
	}

	// 查询数据库中的版本信息
	var dbVersion model.DockerVersion
	result := r.db.WithContext(ctx).First(&dbVersion)

	if result.Error != nil {
		if result.Error == gorm.ErrRecordNotFound {
			// 数据库中没有记录，创建新记录
			if err := r.CreateDockerVersion(ctx, currentVersion); err != nil {
				return nil, fmt.Errorf("创建 Docker 版本信息失败: %w", err)
			}
			return currentVersion, nil
		}
		return nil, fmt.Errorf("查询 Docker 版本信息失败: %w", result.Error)
	}

	// 检查是否需要更新版本信息
	if util.ShouldUpdateVersion(&dbVersion, currentVersion) {
		// 更新数据库中的版本信息
		updatedVersion := util.MergeVersionInfo(&dbVersion, currentVersion)
		if err := r.UpdateDockerVersion(ctx, updatedVersion); err != nil {
			return nil, fmt.Errorf("更新 Docker 版本信息失败: %w", err)
		}
		return updatedVersion, nil
	}

	return &dbVersion, nil
}

// CreateDockerVersion 创建 Docker 版本信息
func (r *dockerVersionRepository) CreateDockerVersion(ctx context.Context, version *model.DockerVersion) error {
	if version == nil {
		return fmt.Errorf("版本信息不能为空")
	}

	result := r.db.WithContext(ctx).Create(version)
	if result.Error != nil {
		return fmt.Errorf("创建 Docker 版本信息失败: %w", result.Error)
	}

	return nil
}

// UpdateDockerVersion 更新 Docker 版本信息
func (r *dockerVersionRepository) UpdateDockerVersion(ctx context.Context, version *model.DockerVersion) error {
	if version == nil {
		return fmt.Errorf("版本信息不能为空")
	}

	result := r.db.WithContext(ctx).Model(version).Updates(version)
	if result.Error != nil {
		return fmt.Errorf("更新 Docker 版本信息失败: %w", result.Error)
	}

	return nil
}
